#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 计算字符的长度
int calcute_len(char *ch)
{
	int len = 0;
	while(*ch != '\0'){
		len++;	// 累计字符的个数
		ch++;	// 字符串指针不断向后移动
	}
	return len;
}

// 字符串转小写
void lower(char* dest,char* source)
{
	while(*source != '\0')
	{
		int ch = *source;
		*dest = tolower(ch);
		source++;
		dest++;
	}
	*dest = '\0'; 
}

// 截取字符串
char* substr(char* str,int start,int end)
{
	int len = end - start;
	// 申请保存字符串的内存
	char* sub = (char*)malloc(sizeof(char)*len);
	printf("保存字符指针地址：%p\n",sub);
	// 移动指针的位置到需要读取的位置
	str += start;
	int i = 0;
	for(;i<len;i++)
	{
		sub[i] = *str;
		str++;
	}
	sub[len] = '\0';
	return sub;
}

// 替换字符串
char* str_replace(char* str, char* src,char* dst)
{
	printf("------------替换字符串-------------\n");
	// 判断字符串中是否存在待替换的字符
	char* pos = strstr(str,src);
	if(!pos)
	{
		return str; // 返回原字符串
	}
	// 计算需要开辟的内存大小
	int size = strlen(str) - strlen(src) + strlen(dst);
	// 申请待拼接字符串大小
	char* ch = (char*)malloc(sizeof(char)*size);
	// 通过指针计算pos所在的位置
	int center_left = pos - str;
	// 截取src之前的字符串
	char* ch_start = substr(str,0,center_left); 
	// 截取src之后的字符串
	int center_right = center_left + strlen(src);
	char* ch_end = substr(str,center_right,strlen(str));
	// 拼接
	strcpy(ch,ch_start);
	strcat(ch,dst);
	strcat(ch,ch_end);
	// 目前并没有对内存进行回收
	// 递归，直到没有可以替换的字符为止
	return str_replace(ch,src,dst);
}

int main()
{

	char ch[] = {'a','b','c','d','e'};
	ch[0] = 'p';
	printf("ch  = %s\n",ch);

	char* ch2 = "Wu Kai Jie"; // 字符串都是以 \0 结尾
	// 注意：字符串与字符数组的区别是字符数组可以进行修改，但是字符串不可以修改
	printf("ch2 = %s\n",ch2);
	
	// 计算字符的长度
	printf("字符串的长度：%ld\n",strlen(ch2));
	// 通过自定义函数的方式计算字符串的长度
	printf("字符串的长度：%d\n",calcute_len(ch2));
	
	// 字符串与其他类型的转换
	char* num_int = "1";
	char* num_float = "1.0";
	char* num_double = "2.0";
	
	printf("num_int 	= %d\n",atoi(num_int));
	printf("num_float 	= %lf\n",atof(num_float));
	printf("num_double 	= %lf\n",strtod(num_double,NULL));

	// 字符串的比较
	char* str1 = "Jonyer";
	char* str3 = "jonyer";
	int df = strcmp(str1,str3);		// 区分大小写的比较
	int dfi = strcasecmp(str1,str3);	// 不区分大小写的比较
	if(df == 0){
		printf("相等\n");
	} else {
		printf("不相等\n");
	}
	printf("---------------\n");
	if(dfi == 0){
		printf("相等\n");
	} else {
		printf("不相等\n");
	}
	
	// 字符串的查找，包含，拼接，截取，大小写转换
	char* name = "name is wu kai jie";
	char* prefix = "is";
	// 查找is出现的位置，查找到是is出现位置的指针，查找不到返回的是NULL
	char* postion = strstr(name,prefix);
	// 通过指针加减的方式，计算is出现位置的指针与name指针位置的距离
	int location = postion - name;
	printf("location = %d\n",location);
	// 包含
	if(postion > 0){
		printf("包含\n");
	} else {
		printf("不包含\n");
	}
	// 拷贝
	char cpy[20];
	strcpy(cpy,str1);
	printf("cpy = %s\n",cpy);
	// 拼接
	strcat(cpy,str3);
	printf("cpy = %s\n",cpy);

	// substr函数中动态申请了内存，因此需要在使用结束释放内存
	char* sub = substr(ch2,0,3);
	printf("截取字符指针地址：%p\n",sub);
	printf("ch2 截取内容：%s\n",sub);
	// 申请的指针地址和外部指针地址相同
	free(sub);

	// 字符串转小写
	char* letters = "WUKAIJIE";
	printf("dest before: %s\n",letters);
	char dest[24];
	//lower(dest,letters);
	printf("dest after: %s\n",letters);

	// 替换字符串
	char* chs = "aabbccddaabbeeaaccbb";
	char* src = "bb";
	char* dst = "ss";
	char* cha = str_replace(chs,src,dst);
	printf("ch  = %s\n",chs);
	printf("cha = %s\n",cha);

	exit(0);
}

